﻿using AutoMapper;
using ExcellentProjectPlus.Dominio.Seguridades.Entidades;
using Servicios.Seguridad.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using ExcellentProjectPlus.Aplicacion.Seguridades.Personas;
using ExcellentProjectPlus.Dominio.Seguridad.Entidades;

namespace Servicios.Seguridad.Controllers
{
    public class PersonasController : ApiController
    {
        #region Propiedades
        IServicioDeGestionDePersonas _servicioDeGestionDePersonas;
        #endregion

        #region Constructores
        public PersonasController(IServicioDeGestionDePersonas servicioDeGestionDePersonas)
        {
            _servicioDeGestionDePersonas = servicioDeGestionDePersonas;
            Mapper.CreateMap<Persona, PersonaModel>();
            //Mapper.CreateMap<Docente, PersonaModel>();
            //Mapper.CreateMap<Estudiante, PersonaModel>();
        }
        #endregion

        public IHttpActionResult Get()
        {
            return Ok(Mapper.Map<IEnumerable<Persona>, IEnumerable<PersonaModel>>
                (_servicioDeGestionDePersonas.ObtenerPersonas()));
        }

        [ResponseType(typeof(PersonaModel))]
        public IHttpActionResult GetPersona(int id)
        {
            Persona persona = _servicioDeGestionDePersonas.ObtenerPersonaPorId(id);
            if (persona == null)
            {
                return NotFound();
            }
            return Ok(Mapper.Map<Persona, PersonaModel>(persona));
        }


        [ResponseType(typeof(Persona))]
        public IHttpActionResult Post(Persona persona)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _servicioDeGestionDePersonas.AgregarPersona(persona);

            return CreatedAtRoute("DefaultApi", new { id = persona.Id }, persona);
        }


        public IHttpActionResult Put(int id, Persona persona)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != persona.Id)
            {
                return BadRequest();
            }

            _servicioDeGestionDePersonas.ModificarPersona(persona);

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(Persona))]
        public IHttpActionResult Delete(int id)
        {
            Persona persona = _servicioDeGestionDePersonas.ObtenerPersonaPorId(id);
            if (persona == null)
            {
                return NotFound();
            }

            _servicioDeGestionDePersonas.EliminarPersona(persona);

            return Ok(persona);
        }

        [Route("~/api/personas/obtenerpornombre/{usuario}")]
        [ResponseType(typeof(PersonaModel))]
        public IHttpActionResult GetDatosPersona(string usuario)
        {
            Persona persona = _servicioDeGestionDePersonas.ObtenerPersonaPorNombreUsuario(usuario);
            if (persona == null)
            {
                return NotFound();
            }
            return Ok(Mapper.Map<Persona, PersonaModel>(persona));
        }

        private bool PersonaExists(int id)
        {
            return _servicioDeGestionDePersonas.ObtenerPersonaPorId(id) != null;
        }
    }
}
